home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Die Speccy' 97
/
Die Speccy' 97.iso
/
amiga_system
/
the_aminet
/
util
/
boot
/
noclick_1_2.lha
/
NoClick
/
NoClick.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-15
|
13KB
|
605 lines
; /*
dcc NoClick.c -r -mS -mi -proto -v -oNoClick
Quit
*/
/*
**
** $VER: NoClick.c 1.2 (15.9.95)
** NoClick 1.0
**
** (C) Copyright 1994-95 by Roland 'Gizzy' Mainz
**
**
*/
/* amiga includes */
#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <workbench/startup.h>
#include <workbench/icon.h>
#include <devices/trackdisk.h>
/* amiga prototypes */
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/icon_protos.h>
#include <clib/alib_protos.h>
/* ansi includes */
#include <string.h>
/* version string */
#include "NoClick_rev.h"
/* misc defines */
#define NAME "NoClick"
/* prototypes */
void chkabort( void );
long wbmain( struct WBStartup * );
long main( long, STRPTR * );
static void DefaultSettings( void );
static void FreeInitProjectResult( void );
static void ClearRDA( void );
static void ScanRDA( void );
static void ScanToolTypes( STRPTR * );
static void RunTool( void );
static BOOL OpenLibStuff( void );
static void CloseLibStuff( void );
static BOOL CreateBasicResources( void );
static void DeleteBasicResources( void );
void AttemptOpenLibrary( struct Library **, STRPTR, STRPTR, ULONG );
STRPTR StringSave( STRPTR );
void FreeString( STRPTR );
APTR AllocVecPooled( APTR, ULONG );
void FreeVecPooled( APTR, APTR );
/* version string */
STRPTR versionstring = VERSTAG;
long main_retval,
main_retval2;
static struct RDArgs *startuprda;
/* shared libraries */
struct Library *IntuitionBase,
*IconBase;
/* mempool for strings */
APTR StringPool;
/* template for ReadArgs() */
#define STARTUP_TEMPLATE "DEV=DEVICE,UNIT/N,NOCLICK=OFF/S,CLICK=ON/S"
static
struct
{
STRPTR devicename;
long *unit;
long *noclick;
long *click;
} result;
static
struct
{
STRPTR devicename;
ULONG unit;
BOOL noclick;
BOOL click;
} project;
/* disable CTRL_C break support (DICE CTRL_C abort function) */
void chkabort( void )
{
}
long wbmain( struct WBStartup *wbstartup )
{
return( main( 0L, (STRPTR *)wbstartup ) );
}
long main( long ac, STRPTR *av )
{
LONG numArgs,
x;
struct WBStartup *wbstartup;
struct WBArg *wbarg;
struct DiskObject *tooldobj,
*projectdobj;
BPTR oldToolLock,
oldProjectLock;
x = main_retval2 = 0L;
main_retval = RETURN_OK;
DefaultSettings();
/* Workbench */
if( ac == 0L )
{
wbstartup = (struct WBStartup *)av;
if( CreateBasicResources() )
{
numArgs = wbstartup -> sm_NumArgs;
wbarg = wbstartup -> sm_ArgList;
if( *(wbarg[ 0 ] . wa_Name) )
{
if( wbarg[ 0 ] . wa_Lock )
{
oldToolLock = CurrentDir( (wbarg[ 0 ] . wa_Lock) );
}
if( tooldobj = GetDiskObjectNew( (wbarg[ 0 ] . wa_Name) ) )
{
/* two possible cases when started from workbench ... */
if( numArgs < 2L )
{
/* ... first case, only our tool icon is given, create one project here */
ScanToolTypes( (STRPTR *)(tooldobj -> do_ToolTypes) );
RunTool();
FreeInitProjectResult();
}
else
{
/* ... second case, a couple of project icons are given, multiple projects will start from here */
for( x = 1L ; x < numArgs ; x++ )
{
if( wbarg[ x ] . wa_Lock )
{
oldProjectLock = CurrentDir( (wbarg[ x ] . wa_Lock) );
}
if( *(wbarg[ x ] . wa_Name) )
{
if( projectdobj = GetDiskObject( (wbarg[ x ] . wa_Name) ) )
{
ScanToolTypes( (STRPTR *)(tooldobj -> do_ToolTypes) );
ScanToolTypes( (STRPTR *)(projectdobj -> do_ToolTypes) );
RunTool();
FreeInitProjectResult();
DefaultSettings();
FreeDiskObject( projectdobj );
}
}
if( wbarg[ x ] . wa_Lock )
{
CurrentDir( oldProjectLock );
}
}
}
FreeDiskObject( tooldobj );
}
if( wbarg[ 0 ] . wa_Lock )
{
CurrentDir( oldToolLock );
}
}
DeleteBasicResources();
}
}
else
{
/* CLI/Shell */
if( CreateBasicResources() )
{
if( startuprda = ReadArgs( STARTUP_TEMPLATE, (LONG *)(&result), NULL ) )
{
/* did we get a CTRL_C signal ? */
if( !CheckSignal( SIGBREAKF_CTRL_C ) )
{
ScanRDA();
RunTool();
FreeInitProjectResult();
}
else
{
main_retval2 = ERROR_BREAK;
main_retval = RETURN_WARN;
}
FreeArgs( startuprda );
}
else
{
main_retval2 = IoErr();
main_retval = RETURN_ERROR;
}
PrintFault( main_retval2, NAME );
DeleteBasicResources();
}
}
SetIoErr( main_retval2 );
return( main_retval );
}
void DefaultSettings( void )
{
ClearRDA();
result . devicename = TD_NAME;
memset( (&project), 0, sizeof(project) );
}
void ClearRDA( void )
{
memset( (&result), 0, sizeof(result) );
}
void ScanRDA( void )
{
if( result . devicename )
{
FreeString( (project . devicename) );
project . devicename = StringSave( (result . devicename) );
}
if( result . unit )
{
project . unit = (ULONG)(*(result . unit));
}
if( result . click )
{
project . click = TRUE;
}
if( result . noclick )
{
project . noclick = TRUE;
}
ClearRDA();
}
void ScanToolTypes( STRPTR *tt )
{
STRPTR s;
if( s = FindToolType( tt, "DEVICENAME" ) )
result . devicename = s;
if( s = FindToolType( tt, "DEV" ) )
result . devicename = s;
if( s = FindToolType( tt, "UNIT" ) )
StrToLong( s, (LONG *)(&(project . unit)) );
if( s = FindToolType( tt, "NOCLICK" ) )
result . noclick = (long *)s;
if( s = FindToolType( tt, "OFF" ) )
result . noclick = (long *)s;
if( s = FindToolType( tt, "CLICK" ) )
result . click = (long *)s;
if( s = FindToolType( tt, "ON" ) )
result . click = (long *)s;
ScanRDA();
}
static
void FreeInitProjectResult( void )
{
FreeString( (project . devicename) );
}
BOOL CreateBasicResources( void )
{
if( OpenLibStuff() )
{
if( StringPool = CreatePool( MEMF_PUBLIC, 1024L, 1024L ) )
{
return( TRUE );
/* DeletePool( StringPool ); */
}
CloseLibStuff();
}
return( FALSE );
}
void DeleteBasicResources( void )
{
DeletePool( StringPool );
CloseLibStuff();
}
BOOL OpenLibStuff( void )
{
if( IntuitionBase = OpenLibrary( "intuition.library", 39UL ) )
{
AttemptOpenLibrary( (&IconBase), NAME, ICONNAME, 37UL );
if( IconBase )
{
return( TRUE );
}
}
CloseLibStuff();
return( FALSE );
}
void CloseLibStuff( void )
{
CloseLibrary( IconBase );
CloseLibrary( IntuitionBase );
}
void AttemptOpenLibrary( struct Library **library, STRPTR title, STRPTR libname, ULONG libversion )
{
struct EasyStruct LibNotFoundES =
{
sizeof(struct EasyStruct),
0,
title,
"%s\nnot found.",
"Retry|Cancel"
};
struct EasyStruct LibWrongVersionES =
{
sizeof(struct EasyStruct),
0,
title,
"Requires at least\n%s version %lu",
"Cancel"
};
if( (*library) == NULL )
{
for(;;)
{
/* attemp to open shared library */
(*library) = OpenLibrary( libname, 0UL );
if( *library )
{
if( ((*library) -> lib_Version) < libversion )
{
(void)EasyRequest( NULL, (&LibWrongVersionES), 0UL, libname, libversion );
CloseLibrary( (*library) );
(*library) = NULL;
}
break;
}
/* prompt the user */
if( EasyRequest( NULL, (&LibNotFoundES), 0UL, libname ) == 0L )
{
/* user canceled */
break;
}
}
}
}
STRPTR StringSave( STRPTR s )
{
STRPTR saved;
if( s )
{
if( saved = (STRPTR)AllocVecPooled( StringPool, (strlen( s ) + 4L) ) )
{
strcpy( saved, s );
return( saved );
}
}
return( NULL );
}
void FreeString( STRPTR s )
{
if( s )
{
FreeVecPooled( StringPool, s );
}
}
APTR AllocVecPooled( APTR poolheader, ULONG memsize )
{
ULONG *memory;
memsize += sizeof(ULONG);
if( memory = (ULONG *)AllocPooled( poolheader, memsize ) )
{
*memory = memsize;
memory++;
}
return( (APTR)memory );
}
void FreeVecPooled( APTR poolheader, APTR mem )
{
ULONG *memory;
if( mem )
{
memory = (ULONG *)mem;
memory--;
FreePooled( poolheader, memory, (*memory) );
}
}
void RunTool( void )
{
struct IOExtTD *diskreq;
struct MsgPort *diskport;
struct TDU_PublicUnit *diskunit;
diskunit = NULL; /* Used to detect if OpenDevice() fails */
struct EasyStruct CantOpenDeviceES =
{
sizeof(struct EasyStruct),
0,
NAME,
"Cant open %s\n"
"unit %lu.",
"Retry|Cancel"
};
struct EasyStruct ClickInfoES =
{
sizeof(struct EasyStruct),
0,
NAME,
"%s\n"
"unit %lu\n"
"has noclick flag %sset.",
"Ok"
};
if( diskport = CreateMsgPort() )
{
if( diskreq = (struct IOExtTD *)CreateExtIO( diskport, (ULONG)sizeof(struct IOExtTD) ) )
{
for( ;; )
{
if( OpenDevice( (project . devicename), (project . unit), (struct IORequest *)diskreq, TDF_ALLOW_NON_3_5 ) == (BYTE)0 )
{
diskunit = (struct TDU_PublicUnit *)(diskreq -> iotd_Req . io_Unit);
if( (project . click) || (project . noclick) )
{
Forbid();
if( project . click )
{
diskunit -> tdu_PubFlags ^= TDPF_NOCLICK;
}
if( project . noclick )
{
diskunit -> tdu_PubFlags |= TDPF_NOCLICK;
}
Permit();
}
else
{
STRPTR ClickSet;
Forbid();
ClickSet = ((((diskunit -> tdu_PubFlags) & TDPF_NOCLICK))?(""):("not "));
Permit();
if( Cli() )
{
Printf( "%s unit %lu has noclick flag %sset.\n", (project . devicename), (project . unit), ClickSet );
}
else
{
EasyRequest( NULL, (&ClickInfoES), NULL, (project . devicename), (project . unit), ClickSet );
}
}
CloseDevice( (struct IORequest *)diskreq );
break;
}
else
{
if( EasyRequest( NULL, (&CantOpenDeviceES), NULL, (project . devicename), (project . unit) ) == 0L )
{
/* user canceled */
break;
}
}
}
if( diskunit == NULL )
{
main_retval2 = ERROR_OBJECT_NOT_FOUND;
main_retval = RETURN_ERROR;
}
DeleteExtIO( (struct IORequest *)diskreq );
}
else
{
/* Can't create IOExtTD */
main_retval2 = ERROR_NO_FREE_STORE;
main_retval = RETURN_FAIL;
}
DeleteMsgPort( diskport );
}
else
{
/* Can't create msgport */
main_retval2 = ERROR_NO_FREE_STORE;
main_retval = RETURN_FAIL;
}
}